package org.smart4j.framework.helper;

import java.lang.reflect.Field;
import java.util.Map;
import org.smart4j.framework.annotation.Inject;
import org.smart4j.framework.util.ArrayUtil;
import org.smart4j.framework.util.CollectionUtil;
import org.smart4j.framework.util.ReflectionUtil;

/**
 * 依赖注入助手类
 * 这个类是通过扫描类的属性的注解来实现对类属性的注入的
 *
 */
public final class IocHelper {

    static {
        Map<Class<?>, Object> beanMap = BeanHelper.getBeanMap();
        if (CollectionUtil.isNotEmpty(beanMap)) {
            // 循环处理所有的【类和对应的类对象】之间的映射
            for (Map.Entry<Class<?>, Object> beanEntry : beanMap.entrySet()) {
                // 获取类类型
                Class<?> beanClass = beanEntry.getKey();
                // 获取类的实例
                Object beanInstance = beanEntry.getValue();
                // 获取类的所有属性
                Field[] beanFields = beanClass.getDeclaredFields();
                if (ArrayUtil.isNotEmpty(beanFields)) {
                    // 循环处理类的所有属性
                    for (Field beanField : beanFields) {
                        // 为所有带有Inject注解的属性注入依赖对象
                        if (beanField.isAnnotationPresent(Inject.class)) {
                            // 获取属性的类型
                            Class<?> beanFieldClass = beanField.getType();
                            // 获取属性对应的对象
                            Object beanFieldInstance = beanMap.get(beanFieldClass);
                            if (beanFieldInstance != null) {
                                // 把对象注入到属性中
                                ReflectionUtil.setField(beanInstance, beanField, beanFieldInstance);
                            }
                        }
                    }
                }
            }
        }
    }
}
